﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QuanLyKho.Server;
using System.Transactions;

namespace QuanLyKho.Server.BLL
{
    public class PhieuXuatThuocChiTietBLL
    {
        public PhieuXuatThuocChiTietBLL()
        {
           
        }

        public IList<PhieuXuatThuocChiTiet> RetrievePhieuXuatChiTiet(int idPhieuXuat)
        {
            IList<PhieuXuatThuocChiTiet> list;
            using (QuanLyKhoEntities entities = new QuanLyKhoEntities(QuanLyKhoServerGlobal.ConnectionString))
            {
                list = entities.PhieuXuatThuocChiTiets.Include("PhieuNhapThuocChiTiet")
                                                    .Include("PhieuNhapThuocChiTiet.PhieuNhapThuoc")
                                                    .Include("PhieuNhapThuocChiTiet.PhieuNhapThuoc.Dm_NhaPhanPhoi")
                                                    .Include("PhieuNhapThuocChiTiet.Dm_Thuoc")
                                                    .Include("PhieuNhapThuocChiTiet.Dm_Thuoc.Dm_HamLuong")
                                                    .Include("PhieuNhapThuocChiTiet.Dm_Thuoc.Dm_DonViTinh")
                                                    .Include("PhieuNhapThuocChiTiet.Dm_Thuoc.Dm_QuyCach")
                                                    .Where(u => u.IdPhieuXuat == idPhieuXuat).ToList();
            }
            return list;
        }

        public bool DeletePhieuXuatChiTiet(int idPhieuXuatChiTiet)
        {
            bool isSuccess = false;
            using (TransactionScope trans = new TransactionScope())
            {
                try
                {
                    TonKhoThuocBLL tonKhoBLL = new TonKhoThuocBLL();
                    PhieuNhapThuocChiTietBLL nhapChiTietBLL = new PhieuNhapThuocChiTietBLL();
                    using (QuanLyKhoEntities entities = new QuanLyKhoEntities(QuanLyKhoServerGlobal.ConnectionString))
                    {
                        PhieuXuatThuocChiTiet chiTiet = entities.PhieuXuatThuocChiTiets.Include("PhieuNhapThuocChiTiet").Single(u => u.IdPhieuXuatChiTiet == idPhieuXuatChiTiet);
                        if (chiTiet != null)
                        {
                            // Thực hiện trừ số lượng trong kho thuốc
                            tonKhoBLL.CongTruSoLuongTonKhoThuoc(chiTiet.PhieuNhapThuocChiTiet.MaThuoc, chiTiet.SoLuong, true, entities);

                            // Thực hiện cộng vào số lượng còn lại trong chi tiết phiếu nhập
                            nhapChiTietBLL.CongTruSoLuongConLai(chiTiet.IdPhieuNhapChiTiet, chiTiet.SoLuong, true, entities);

                            // Thực hiện xóa trong Entities
                            entities.PhieuXuatThuocChiTiets.Remove(chiTiet);

                            // Lưu vào CSDL
                            entities.SaveChanges();
                        }
                    }

                    trans.Complete();
                    isSuccess = true;
                }
                catch (Exception)
                {
                    isSuccess = false;
                }
            }

            return isSuccess;
        }

        public bool CreatePhieuXuatChiTiet(PhieuXuatThuoc phieuXuat, List<PhieuXuatThuocChiTiet> listChiTietAdd, List<PhieuXuatThuocChiTiet> listChiTietUpdate)
        {
            bool isSuccess = false;

            TonKhoThuocBLL tonKhoBLL = new TonKhoThuocBLL();
            PhieuNhapThuocChiTietBLL nhapChiTietBLL = new PhieuNhapThuocChiTietBLL();

            using (TransactionScope trans = new TransactionScope())
            {
                try
                {
                    using (QuanLyKhoEntities entities = new QuanLyKhoEntities(QuanLyKhoServerGlobal.ConnectionString))
                    {
                        // Trường hợp thêm mới phiếu nhập
                        foreach (PhieuXuatThuocChiTiet item in listChiTietAdd)
                        {
                            // Thực hiện thêm mới chi tiết
                            PhieuXuatThuocChiTiet chiTiet = new PhieuXuatThuocChiTiet();
                            chiTiet.IdPhieuXuat = phieuXuat.IdPhieuXuat;
                            chiTiet.SoLuong = item.SoLuong;
                            chiTiet.GiaXuat = item.GiaXuat;
                            chiTiet.IdPhieuNhapChiTiet = item.IdPhieuNhapChiTiet;
                            entities.PhieuXuatThuocChiTiets.Add(chiTiet);

                            // Lưu tất cả thông tin phiếu nhập chi tiết và chi tiết giá xuất
                            entities.SaveChanges();

                            // Update giá xuất cho phiếu nhập
                            PhieuNhapThuocChiTiet nhapChiTiet = entities.PhieuNhapThuocChiTiets.SingleOrDefault(u => u.IdPhieuNhapChiTiet == item.IdPhieuNhapChiTiet);
                            if (nhapChiTiet != null)
                            {
                                nhapChiTiet.GiaXuat = item.GiaXuat;
                            }
                            entities.SaveChanges();

                            // Thực hiện trừ số lượng trong phiếu nhập ==> số lượng còn lại
                            nhapChiTietBLL.CongTruSoLuongConLai(item.IdPhieuNhapChiTiet, item.SoLuong, false, entities);

                            // Thực hiện cộng số lượng vào kho thuốc
                            tonKhoBLL.CongTruSoLuongTonKhoThuoc(item.PhieuNhapThuocChiTiet.MaThuoc, item.SoLuong, false, entities);
                        }

                        // Tạo ra chi tiết phiếu nhập
                        foreach (PhieuXuatThuocChiTiet item in listChiTietUpdate)
                        {
                            // Trường hợp cập nhật
                            // Lấy chi tiết đang có trong CSDL
                            PhieuXuatThuocChiTiet chiTietOld = entities.PhieuXuatThuocChiTiets.FirstOrDefault(u => u.IdPhieuXuatChiTiet == item.IdPhieuXuatChiTiet);
                            if (chiTietOld != null)
                            {
                                // Thực hiện cộng số lượng trong phiếu nhập ==> số lượng còn lại
                                nhapChiTietBLL.CongTruSoLuongConLai(chiTietOld.IdPhieuNhapChiTiet, chiTietOld.SoLuong, true, entities);

                                // Thực hiện cộng số lượng trong kho thuốc
                                tonKhoBLL.CongTruSoLuongTonKhoThuoc(chiTietOld.PhieuNhapThuocChiTiet.MaThuoc, chiTietOld.SoLuong, true, entities);

                                // Thực hiện xóa chi tiết đã tồn tại trước đó trong CSDL
                                entities.PhieuXuatThuocChiTiets.Remove(chiTietOld);
                                entities.SaveChanges();

                                // Thực hiện thêm lại chi tiết
                                PhieuXuatThuocChiTiet chiTiet = new PhieuXuatThuocChiTiet();
                                chiTiet.IdPhieuXuat = item.IdPhieuXuat;
                                chiTiet.SoLuong = item.SoLuong;
                                chiTiet.GiaXuat = item.GiaXuat;
                                chiTiet.IdPhieuNhapChiTiet = item.IdPhieuNhapChiTiet;
                                entities.PhieuXuatThuocChiTiets.Add(chiTiet);

                                // Lưu tất cả thông tin phiếu nhập chi tiết và chi tiết giá xuất
                                entities.SaveChanges();

                                // Update giá xuất cho phiếu nhập
                                PhieuNhapThuocChiTiet nhapChiTiet = entities.PhieuNhapThuocChiTiets.SingleOrDefault(u => u.IdPhieuNhapChiTiet == item.IdPhieuNhapChiTiet);
                                if (nhapChiTiet != null)
                                {
                                    nhapChiTiet.GiaXuat = item.GiaXuat;
                                }
                                entities.SaveChanges();

                                // Thực hiện trừ số lượng vào kho thuốc
                                tonKhoBLL.CongTruSoLuongTonKhoThuoc(item.PhieuNhapThuocChiTiet.MaThuoc, item.SoLuong, false, entities);

                                // Thực hiện trừ số lượng trong phiếu nhập ==> số lượng còn lại
                                nhapChiTietBLL.CongTruSoLuongConLai(item.IdPhieuNhapChiTiet, item.SoLuong, false, entities);
                            }
                        }
                    }

                    trans.Complete();
                    isSuccess = true;
                }
                catch (Exception)
                {
                    isSuccess = false;
                }
                
            }

            return isSuccess;
        }
    }
}
